/*
 * GameObject.h
 *
 *  Created on: 30/07/2010
 *      Author: alex
 */

#ifndef GAMEOBJECT_H_
#define GAMEOBJECT_H_

#include <string>
#include "components/Sprite.h"


/**
 * Classe base de todos os objetos visíveis do jogo.
 *
 * Tudo que é visível dentro do jogo é um GameObject. Até o background. Um
 * objeto simples que só precisa possuir uma sprite e ser renderizado pode ser
 * obtido simplesmente instanciando-se um GameObject com os parâmetros
 * adequados. Mas um objeto mais complexo, que pode precisar se mover, tocar
 * sons e outras coisas deve ser de uma subclasse de GameObject. Essa subclasse
 * precisa sobrescrever os métodos "update" e "collides", que nessa classe não
 * fazem nada.
 */
class GameObject {

public:

	GameObject(const std::string& stopped);

	/**
	 * Atualiza o estado desse objeto.
	 *
	 * Precisa ser sobrescrito nas classes filhas.
	 */
	virtual GameObject& update(int dt) {
		if (x < -1000) x = -1000;
		if (x > 1000) x = 1000;
		if (y < -600) y = -600;
		if (y > 600) y = 600;
		return *this;
	}

	/**
	 * Renderiza esse objeto na tela.
	 */
	virtual void render(SDL_Surface* screen);

	/**
	 * Determina o que fazer quando o objeto colidir.
	 */
	bool collidesWith(const GameObject& other) const;

	GameObject& setX(float x) {
		this->x = x;
		return *this;
	}

	GameObject& setY(float y) {
		this->y = y;
		return *this;
	}

	/**
	 * Retorna a coordenada X do objeto.
	 */
	float getX() const {
		return x;
	}

	/**
	 * Retorna a coordenada Y do objeto.
	 */
	float getY() const {
		return y;
	}

	float getRadius() const {
		return radius;
	}

	SDL_Rect* getPointer() {
		return &rect;
	}

	int getLife() const {
		return life;
	}

	GameObject& hit(int hit) {
		life -= hit;
		return *this;
	}

protected:

	/**
	 * Coordenadas X e Y do objeto.
	 */
	float x, y;

	SDL_Rect rect;

	Sprite stopped;

	/**
	 * Raio do objeto, para a colisão.
	 */
	float radius;

	int life;

};


#endif /* GAMEOBJECT_H_ */
